﻿using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using CentroVentas.Clases.Utiles;

namespace CentroVentas.Funciones.Compras
{
	public partial class FrmCompra : Form
	{
		private int _idCompra;
		private int _idUsuario;
		private int _idProveedor;

		private int _canProductos;
		private double _total;
		

		private DataSet dsCompra;

		public FrmCompra(int idUsuario)
		{
			InitializeComponent();
			_idUsuario = idUsuario;
			CrearCompra();
			recargarGrilla();
		}

		/// <summary>
		/// FUNCION QUE DIBUJARA LOS ELEMENTOS DEL TABCONTROL EN FORMA HORIZONTAL.
		/// Dont touch it! It's magic!
		/// /* Seriously, people will die if you change this */
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
		{
			Graphics g = e.Graphics;
			Brush _TextBrush;

			// Get the item from the collection.
			TabPage _TabPage = tabControl1.TabPages[e.Index];

			// Get the real bounds for the tab rectangle.
			Rectangle _TabBounds = tabControl1.GetTabRect(e.Index);

			if (e.State == DrawItemState.Selected)
			{
				// Draw a different background color, and don't paint a focus rectangle.
				_TextBrush = new SolidBrush(e.ForeColor);
				g.FillRectangle(Brushes.Gray, e.Bounds);
			}
			else
			{
				_TextBrush = new System.Drawing.SolidBrush(e.ForeColor);
				e.DrawBackground();
			}

			// Use our own font. Because we CAN.
			Font _TabFont = new Font("Arial", 15, FontStyle.Regular, GraphicsUnit.Pixel);

			// Draw string. Center the text.
			StringFormat _StringFlags = new StringFormat();
			_StringFlags.Alignment = StringAlignment.Center;
			_StringFlags.LineAlignment = StringAlignment.Center;
			g.DrawString(_TabPage.Text, _TabFont, _TextBrush, _TabBounds, new StringFormat(_StringFlags));

		}

		private void FrmCompra_Load(object sender, EventArgs e)
		{
			this.WindowState = FormWindowState.Maximized;
		}

		private void txtRut_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.F2)
			{
				Funciones.Proveedores.FunProveedoresSeleccionar fun = new Proveedores.FunProveedoresSeleccionar();
				if (fun.ShowDialog() == System.Windows.Forms.DialogResult.OK)
				{
					_idProveedor = fun.IdProveedor;
					Clases.Funciones.Proveedores prov = new Clases.Funciones.Proveedores(_idProveedor);
					txtRut.Text = prov.Rut;
					txtProveedorNombre.Text = prov.Nombre;
					txtProveedorCiudad.Text = prov.Ciudad;
					txtProveedorGiro.Text = prov.Giro;
					txtProveedorContacto.Text = prov.Contacto;
					txtProveedorTelefono.Text = prov.Telefono;
					txtProveedorDireccion_1.Text = prov.Direccion1;
					txtProveedorDireccion_2.Text = prov.Direccion2;
					txtProveedorEmail.Text = prov.Email;
				}
			}
		}

		private void btnProveedorCrear_Click(object sender, EventArgs e)
		{
			Funciones.Proveedores.FunProveedoresAgregar fun = new Proveedores.FunProveedoresAgregar();
			if (fun.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				Clases.Funciones.Proveedores prov = new Clases.Funciones.Proveedores(fun.Rut);
				txtRut.Text = prov.Rut;
				txtProveedorNombre.Text = prov.Nombre;
				txtProveedorCiudad.Text = prov.Ciudad;
				txtProveedorGiro.Text = prov.Giro;
				txtProveedorContacto.Text = prov.Contacto;
				txtProveedorTelefono.Text = prov.Telefono;
				txtProveedorDireccion_1.Text = prov.Direccion1;
				txtProveedorDireccion_2.Text = prov.Direccion2;
				txtProveedorEmail.Text = prov.Email;
			}
		}

		private void btnProductoCrear_Click(object sender, EventArgs e)
		{
			int _idPrecio = 0;
			int _idProd = 0;
			Funciones.Productos.FunProductosCrear fun = new Productos.FunProductosCrear(true);
			if (fun.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				_idProd = Clases.Funciones.Producto.GetIdProductoByIdPrecio(fun.IdPrecio);
				_idPrecio = fun.IdPrecio;

				AgregarProductoCarro(fun.IdPrecio);
				recargarGrilla();
				CalcularTotales();

			}
		}

		private void recargarGrilla()
		{
			dgvDetalleCompra.DataSource = dsCompra;
			dgvDetalleCompra.DataMember = "DetalleCompra";
			dgvDetalleCompra.Columns["IdPrecio"].Visible = false;
		}

		private void txtProducto_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.F2)
			{
				Funciones.Productos.FunProductosSeleccionar fun = new Productos.FunProductosSeleccionar();
				if (fun.ShowDialog() == System.Windows.Forms.DialogResult.OK)
				{
					Funciones.Productos.FunProductosCompraNueva funcion = new Productos.FunProductosCompraNueva(fun.IdProducto);
					if (funcion.ShowDialog() == DialogResult.OK)
					{
						AgregarProductoCarro(funcion.Idprecio);
						recargarGrilla();
					}
				}
			}
		}

		private void btnProductoSeleccionar_Click(object sender, EventArgs e)
		{
			Funciones.Productos.FunProductosSeleccionar fun = new Productos.FunProductosSeleccionar();
			if (fun.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				if (dsCompra.Tables["DetalleCompra"].Rows.Count == 0)
				{
					try
					{
						Funciones.Productos.FunProductosCompraNueva funcion = new Productos.FunProductosCompraNueva(fun.IdProducto);
						if (funcion.ShowDialog() == DialogResult.OK)
						{
							AgregarProductoCarro(funcion.Idprecio);
							recargarGrilla();
							CalcularTotales();
						}
					}
					catch (Exception ex)
					{

						Clases.Utiles.Utilidades.mensaje(Clases.Utiles.TipoMensaje.ERROR, ex.Message, 1);
					}
				}
				else
				{
					foreach (DataRow dr in dsCompra.Tables["DetalleCompra"].Rows)
					{                        
						if (dr["IdProd"].ToString() == fun.IdProducto.ToString())
						{
							Funciones.Productos.FrmCantidad can = new Productos.FrmCantidad();
							if (can.ShowDialog() == DialogResult.OK)
							{
								Clases.Funciones.Core.Precio precio = new Clases.Funciones.Core.Precio(fun.IdPrecio);
								precio.Cantidad = can.Cantidad;
								dr["Cantidad"] = Convert.ToInt32(dr["Cantidad"]) + can.Cantidad;
								dr["SubTotal"] = Convert.ToDouble(dr["Costo"].ToString().Replace("$","").Replace(".","")) * Convert.ToInt32(dr["Cantidad"]);
								recargarGrilla();
								CalcularTotales();                            
							}                            
						}
						else
						{
							Funciones.Productos.FunProductosCompraNueva funcion = new Productos.FunProductosCompraNueva(fun.IdProducto);
							if (funcion.ShowDialog() == DialogResult.OK)
							{
								AgregarProductoCarro(funcion.Idprecio);
								recargarGrilla();
								CalcularTotales();
							}                            
						}
					}
				}
				
				
			}
		}

		private void CrearCompra()
		{            
			dsCompra = new DataSet();
			dsCompra.Tables.Add("DetalleCompra");

			dsCompra.Tables["DetalleCompra"].Columns.Add("IdProd");
			dsCompra.Tables["DetalleCompra"].Columns.Add("IdPrecio");
			dsCompra.Tables["DetalleCompra"].Columns.Add("CodBarras");
			dsCompra.Tables["DetalleCompra"].Columns.Add("Desc");
			dsCompra.Tables["DetalleCompra"].Columns.Add("Marca");
			dsCompra.Tables["DetalleCompra"].Columns.Add("Costo");
			dsCompra.Tables["DetalleCompra"].Columns.Add("Cantidad");
			dsCompra.Tables["DetalleCompra"].Columns.Add("Subtotal");

			dsCompra.Tables["DetalleCompra"].Columns["IdProd"].Caption = "IdProducto";
			dsCompra.Tables["DetalleCompra"].Columns["IdPrecio"].Caption = "IdPrecio";
			dsCompra.Tables["DetalleCompra"].Columns["CodBarras"].Caption = "Codigo Barras";
			dsCompra.Tables["DetalleCompra"].Columns["Desc"].Caption = "Descripción";
			dsCompra.Tables["DetalleCompra"].Columns["Marca"].Caption = "Marca";
			dsCompra.Tables["DetalleCompra"].Columns["Costo"].Caption = "Costo";
			dsCompra.Tables["DetalleCompra"].Columns["Cantidad"].Caption = "Cantidad";
			dsCompra.Tables["DetalleCompra"].Columns["Subtotal"].Caption = "Subtotal";
		}

		private void AgregarProductoCarro(int idPrecio)
		{
			try
			{
				DataRow dr = dsCompra.Tables["DetalleCompra"].NewRow();
				Clases.Funciones.Producto prod = new Clases.Funciones.Producto(Clases.Funciones.Producto.GetIdProductoByIdPrecio(idPrecio));
				dr[0] = prod.Id;
				dr[1] = idPrecio;
				dr[2] = prod.CodigoBarras;
				dr[3] = prod.Descripcion;
				dr[4] = prod.NombreMarca;
				Clases.Funciones.Core.Precio precio = new Clases.Funciones.Core.Precio(idPrecio);
				dr[5] = Clases.Currency.formatearMoneda(precio.Costo);
				dr[6] = precio.Cantidad;
				dr[7] = Clases.Currency.formatearMoneda(precio.Costo * precio.Cantidad);
				dsCompra.Tables["DetalleCompra"].Rows.Add(dr);
			}
			catch (Exception)
			{
				
				throw;
			}
		}

		private void CalcularTotales() 
		{
			_canProductos = 0;
			_total = 0;
			foreach (DataRow dr in dsCompra.Tables["DetalleCompra"].Rows)
			{
				_total += Convert.ToDouble(dr["Subtotal"].ToString().Replace("$","").Replace(".",""));
				_canProductos += Convert.ToInt32(dr["Cantidad"]);
			}

			txtTotal.Text = Clases.Currency.formatearMoneda(_total);
			txtTotalCProd.Text = _canProductos.ToString();
		}

		private void btnProductoModificar_Click(object sender, EventArgs e)
		{
			CalcularTotales();
		}

		private void btnProductoEliminar_Click(object sender, EventArgs e)
		{
			CalcularTotales();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			CalcularTotales();
		}

		private void btnCompra_Click(object sender, EventArgs e)
		{
			if (dsCompra.Tables["DetalleCompra"].Rows.Count != 0)
			{
				if (_idProveedor != 0)
				{
					// TODO: Agregar función de comentarios.
					_idCompra = Clases.Funciones.Compras.CrearCompra(_idUsuario, _idProveedor, "", dsCompra);
					if (_idCompra != 0)
					{
						this.DialogResult = DialogResult.OK;

						// Clases.Reportes.MostrarCompra(_idCompra,crv);
						Clases.Reportes.ImprimirCompra(_idCompra);
						Clases.Utiles.Utilidades.mensaje(TipoMensaje.OK, "Compra realizada con exito.", 0);
						this.Dispose();
					}
				}
				else
				{
					Utilidades.mensaje(TipoMensaje.ERROR, "No ha seleccionado proveedor.", 35);
				}
			}
			else
			{
				Utilidades.mensaje(TipoMensaje.ERROR, "No existen productos seleccionados.", 35);
			}   
		}

		private void txtRut_TextChanged(object sender, EventArgs e)
		{

		}


	}
}
